package com.smart.community.feign.property.service;

import java.util.List;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import com.smart.community.commons.cache.DataScopeInfo;
import com.smart.community.feign.property.fallback.DataScopeFeignFallbackFactory;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;

/**
 * 数据权限Feign接口
 * 
 * 提供数据权限相关的Feign接口，供其他微服务调用：
 * 1. 获取用户数据权限信息
 * 2. 检查用户权限
 * 3. 获取用户关联的物业公司和社区信息
 * 4. 权限缓存管理
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
@Tag(name = "数据权限Feign接口", description = "数据权限相关Feign接口")
@FeignClient(
    name = "smart-community-property",
    path = "/property",
    fallbackFactory = DataScopeFeignFallbackFactory.class,
    contextId = "dataScopeFeign"
)
public interface DataScopeFeign {
    
    /**
     * 根据用户ID获取DataScopeInfo
     * 
     * @param userId 用户ID
     * @return 数据权限信息
     */
    @Operation(summary = "根据用户ID获取DataScopeInfo")
    @GetMapping("/feign/data-scope/user/{userId}")
    DataScopeInfo getUserDataScope(@Parameter(description = "用户ID") @PathVariable("userId") Long userId);
    
    /**
     * 检查用户是否有指定物业公司的权限
     * 
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     */
    @Operation(summary = "检查用户是否有指定物业公司的权限")
    @GetMapping("/feign/data-scope/has-property-company-permission/{userId}/{propertyCompanyId}")
    Boolean hasPropertyCompanyPermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId);
    
    /**
     * 检查用户是否有指定社区的权限
     * 
     * @param userId 用户ID
     * @param communityId 社区ID
     * @return 是否有权限
     */
    @Operation(summary = "检查用户是否有指定社区的权限")
    @GetMapping("/feign/data-scope/has-community-permission/{userId}/{communityId}")
    Boolean hasCommunityPermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "社区ID") @PathVariable("communityId") Long communityId);
    
    /**
     * 获取用户关联的物业公司ID列表
     * 
     * @param userId 用户ID
     * @return 物业公司ID列表
     */
    @Operation(summary = "获取用户关联的物业公司ID列表")
    @GetMapping("/feign/data-scope/user-property-company-ids/{userId}")
    List<Long> getUserPropertyCompanyIds(@Parameter(description = "用户ID") @PathVariable("userId") Long userId);
    
    /**
     * 根据物业公司ID列表获取用户ID列表
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @return 用户ID列表
     */
    @Operation(summary = "根据物业公司ID列表获取用户ID列表")
    @PostMapping("/feign/data-scope/user-ids-by-property-company-ids")
    List<Long> getUserIdsByPropertyCompanyIds(@RequestBody List<Long> propertyCompanyIds);
    
    /**
     * 清除所有权限缓存
     */
    @Operation(summary = "清除所有权限缓存")
    @PostMapping("/feign/data-scope/clear-all-permission-cache")
    void clearAllPermissionCache();
    
    /**
     * 获取用户所属物业公司管理的社区ID列表
     * 
     * @param userId 用户ID
     * @return 社区ID列表
     */
    @Operation(summary = "获取用户所属物业公司管理的社区ID列表")
    @GetMapping("/feign/data-scope/user-community-ids/{userId}")
    List<Long> getUserCommunityIds(@Parameter(description = "用户ID") @PathVariable("userId") Long userId);
    
    /**
     * 判断用户是否为物业公司用户
     * 
     * @param userId 用户ID
     * @return 是否为物业公司用户
     */
    @Operation(summary = "判断用户是否为物业公司用户")
    @GetMapping("/feign/data-scope/is-property-company-user/{userId}")
    Boolean isPropertyCompanyUser(@Parameter(description = "用户ID") @PathVariable("userId") Long userId);
    
    /**
     * 刷新用户权限缓存
     * 
     * @param userId 用户ID
     */
    @Operation(summary = "刷新用户权限缓存")
    @PostMapping("/feign/data-scope/refresh-user-permission-cache/{userId}")
    void refreshUserPermissionCache(@Parameter(description = "用户ID") @PathVariable("userId") Long userId);
    
    /**
     * 判断用户是否为超级管理员
     * 
     * @param userId 用户ID
     * @return 是否为超级管理员
     */
    @Operation(summary = "判断用户是否为超级管理员")
    @GetMapping("/feign/data-scope/is-user-super-admin/{userId}")
    Boolean isUserSuperAdmin(@Parameter(description = "用户ID") @PathVariable("userId") Long userId);
    
    /**
     * 批量验证用户物业公司权限
     * 
     * @param userId 用户ID
     * @param propertyCompanyIds 物业公司ID列表
     * @return 验证结果，true表示有权限，false表示无权限
     */
    @Operation(summary = "批量验证用户物业公司权限")
    @PostMapping("/feign/data-scope/validate-batch-property-company-permission/{userId}")
    Boolean validateBatchPropertyCompanyPermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "物业公司ID列表") List<Long> propertyCompanyIds);
    
    /**
     * 获取用户有权限的社区ID列表
     * 
     * @param userId 用户ID
     * @param communityIds 待检查的社区ID列表
     * @return 有权限的社区ID列表
     */
    @Operation(summary = "获取用户有权限的社区ID列表")
    @PostMapping("/feign/data-scope/authorized-community-ids/{userId}")
    List<Long> getAuthorizedCommunityIds(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "待检查的社区ID列表") List<Long> communityIds);
    
    /**
     * 检查用户是否有指定模块的权限
     * 
     * @param userId 用户ID
     * @param moduleCode 模块代码
     * @return 是否有权限
     */
    @Operation(summary = "检查用户是否有指定模块的权限")
    @GetMapping("/feign/data-scope/has-module-permission/{userId}/{moduleCode}")
    Boolean hasModulePermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "模块代码") @PathVariable("moduleCode") String moduleCode);
}
